((Scratch)=>{
/* ------- BLOCKS -------- */
const { BlockType, Cast, ArgumentType } = Scratch;
const vm = Scratch.vm;

class MyTool {

    #variable = new Map();

    getInfo() {

        return {
            // id是扩展的id，随便写，不重复
            id: 'yoyo2024318mytool',
            // name 是扩展名字
            name: '扩展模板',
            // 积木颜色
            color1: '#009866',
            // 边框颜色
            // color2: '#009866',
            // menuIconURI 图标地址可以不用

            // 积木列表
            blocks: [
                {
                    // opcode 是积木的函数名
                    opcode: 'annotation',
                    // blockType 积木类型
                    blockType: BlockType.COMMAND,
                    color1: '#353d44',
                    // text是积木显示的中文名  text中输入部分用[]表示 如：输出[temp]
                    text: '//[key]',

                    // 返回值类型
                    arguments: {
                        key: {
                            type: ArgumentType.STRING,
                            defaultValue: '我是注释'
                        }
                    }
                },
                {
                    // opcode 是积木的函数名
                    opcode: 'hasString',
                    // blockType 积木类型
                    blockType: BlockType.BOOLEAN,

                    // text是积木显示的中文名  text中输入部分用[]表示 如：输出[temp]
                    text: '[str]是否包含[key]？(支持正则)',

                    // 返回值类型
                    arguments: {
                        str: {
                            type: ArgumentType.STRING,
                            defaultValue: '你好'
                        },
                        key: {
                            type: ArgumentType.STRING,
                            defaultValue: '你'
                        },
                    }
                },
                '---',
                {
                    // opcode 是积木的函数名
                    opcode: 'operation',
                    // blockType 积木类型
                    blockType: BlockType.REPORTER,

                    // text是积木显示的中文名  text中输入部分用[]表示 如：输出[temp]
                    text: '表达式运算[temp]',

                    // 返回值类型
                    arguments: {
                        temp: {
                            type: ArgumentType.STRING,
                            defaultValue: '1+1-2*3/4'
                        }
                    }
                },
                {
                    // opcode 是积木的函数名
                    opcode: 'operation1',
                    // blockType 积木类型
                    blockType: BlockType.REPORTER,

                    // text是积木显示的中文名  text中输入部分用[]表示 如：输出[temp]
                    text: '表达式 参数 [param] 运算 [param1]',

                    // 返回值类型
                    arguments: {
                        param: {
                            type: ArgumentType.STRING,
                            defaultValue: '你需要传递的'
                        },
                        param1: {
                            type: ArgumentType.STRING,
                            defaultValue: '`"{text}"这是参数的内容`'
                        },
                    }
                },
                '---',
                {
                    // opcode 是积木的函数名
                    opcode: 'setMapvalue',
                    // blockType 积木类型
                    blockType: BlockType.COMMAND,

                    // text是积木显示的中文名  text中输入部分用[]表示 如：输出[temp]
                    text: '设置[key]的值为[value]',

                    // 返回值类型
                    arguments: {
                        key: {
                            type: ArgumentType.STRING,
                            defaultValue: 'str1'
                        },
                        value: {
                            type: ArgumentType.STRING,
                            defaultValue: '你好'
                        }
                    }
                },
                {
                    // opcode 是积木的函数名
                    opcode: 'setMapvalueadd',
                    // blockType 积木类型
                    blockType: BlockType.COMMAND,

                    // text是积木显示的中文名  text中输入部分用[]表示 如：输出[temp]
                    text: '设置[key]的值相加[value]',

                    // 返回值类型
                    arguments: {
                        key: {
                            type: ArgumentType.STRING,
                            menu: 'tempmenu',
                        },
                        value: {
                            type: ArgumentType.STRING,
                            defaultValue: '你好'
                        }
                    }
                },
                {
                    // opcode 是积木的函数名
                    opcode: 'getMapvalue',
                    // blockType 积木类型
                    blockType: BlockType.REPORTER,

                    // text是积木显示的中文名  text中输入部分用[]表示 如：输出[temp]
                    text: '获取[key]的值',

                    // 返回值类型
                    arguments: {
                        key: {
                            type: ArgumentType.STRING,
                            menu: 'tempmenu',
                        },
                    }
                },
                {
                    // opcode 是积木的函数名
                    opcode: 'hasMapvalue',
                    // blockType 积木类型
                    blockType: BlockType.BOOLEAN,

                    // text是积木显示的中文名  text中输入部分用[]表示 如：输出[temp]
                    text: '[key]是否存在？',

                    // 返回值类型
                    arguments: {
                        key: {
                            type: ArgumentType.STRING,
                            menu: 'tempmenu',
                        },
                    }
                },
                {
                    // opcode 是积木的函数名
                    opcode: 'delMapvalue',
                    // blockType 积木类型
                    blockType: BlockType.COMMAND,

                    // text是积木显示的中文名  text中输入部分用[]表示 如：输出[temp]
                    text: '删除[key]',

                    // 返回值类型
                    arguments: {
                        key: {
                            type: ArgumentType.STRING,
                            menu: 'tempmenu',
                        }
                    }
                }
            ],
            menus:{
                tempmenu:{
                    acceptReporters:true,
                    items:'returnMapList'
                }
            }
        }
    }

    /**
     * 字符是否包含支持正则
     * @param {*} args 
     * @returns 
     */
    hasString(args) {
        return new RegExp(args.key).test(String(args.str));
    }

    // map变量
    setMapvalue(args,util) {
        this.#variable.set(args.key, args.value);
    }

    setMapvalueadd(args,util) {
        this.#variable.set(args.key, (this.#variable.get(args.key) || '') + args.value);
    }

    getMapvalue(args) {
        return this.#variable.get(args.key) || '';
    }

    delMapvalue(args) {
        this.#variable.delete(args.key);
    }

    hasMapvalue(args) {
        return this.#variable.has(args.key);
    }
    /**
     * 返回列表所有
     * @returns 
     */
    returnMapList(args){
        return Array.from(this.#variable.keys());
    }


    operation(args) {
        return eval(args.temp);
    }

    operation1(args) {
        return eval(String(args.param1).replace(/\{text\}/ig, String(args.param)));
    }
}

Scratch.extensions.register(new MyTool());


})(Scratch);